package com.xhc.demo.utils;

import java.security.SecureRandom;
import java.util.concurrent.atomic.AtomicLong;

public class UniqueIdGenerator {
    // 字符集：数字和大小写字母
    private static final char[] CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
    
    // 使用SecureRandom提供更好的随机性
    private static final SecureRandom random = new SecureRandom();
    
    // 原子计数器，用于增加唯一性
    private static final AtomicLong counter = new AtomicLong(System.currentTimeMillis());

    /**
     * 生成8位唯一ID
     * 策略：
     * 1. 使用高精度时间戳
     * 2. 加入原子计数器
     * 3. 使用安全随机数生成器
     * 
     * @return 8位唯一ID字符串
     */
    public static String generateUniqueId() {
        // 获取当前纳秒时间的后6位
        long timestamp = System.nanoTime() % 1000000;
        
        // 获取计数器值
        long count = counter.incrementAndGet() % 10000;
        
        // 组合时间戳和计数器作为种子
        long seed = timestamp * 10000 + count;
        
        // 生成8位ID
        StringBuilder id = new StringBuilder(8);
        for (int i = 0; i < 8; i++) {
            // 使用种子和SecureRandom生成随机索引
            random.setSeed(seed + i);
            int index = random.nextInt(CHARS.length);
            id.append(CHARS[index]);
        }
        
        return id.toString();
    }

    /**
     * 验证生成的ID是否符合要求
     * 
     * @param id 待验证的ID
     * @return 是否为有效的8位ID
     */
    public static boolean isValidId(String id) {
        if (id == null || id.length() != 8) {
            return false;
        }
        
        for (char c : id.toCharArray()) {
            boolean valid = false;
            for (char validChar : CHARS) {
                if (c == validChar) {
                    valid = true;
                    break;
                }
            }
            if (!valid) {
                return false;
            }
        }
        
        return true;
    }
}
